Lab 02 - System kontroli wersji - Git

System kontroli wersji - Git

Wprowadzenie do kontroli wersji

System kontroli wersji służy do śledzenia zmian dokonywanych w pliku (lub plikach) i umożliwia powrót do dowolnego wcześniejszego stanu. Jest to powszechnie wykorzystywane narzędzie w projektach programistycznych chociaż objęcie kontroli wersji jest możliwe dla dowolnego typu pliku na komputerze.

Jeśli interesujesz się grafiką lub projektowaniem stron WWW i chcesz zachować każdą wersję pliku graficznego lub układu witryny WWW (co wydaje się być rozsądnym pomysłem), to zastosowanie systemu kontroli wersji jest odpowiednim do tego narzędziem. Pozwala ono na: * przywracanie pliku (lub plików) do wcześniejszej wersji, * odtwarzanie stanu całego projektu, * porównywanie wprowadzonych zmian (nawet gdy jeden plik edytowało wiele osób), * pozyskanie informacji o tym kto i kiedy wprowadził daną modyfikację.

Najpowszechniej rozdystrybuowanym systemem kontroli wersji jest Git a tworzone w jego ramach projekty to repozytoria. Popularna witryna GitHub stanowi sieciowy hosting dla repozytoriów Gita.


Interaktywne wprowadzenie do Gita

Aby rozpocząć pracę z Gitem zapoznaj się z interaktywnym poradnikiem dostępnym na stronie learngitbranching. Opisane są w nim najważniejsze koncepty, które również są przedstawione w intuicyjnej, graficznej formie.

🛠🔥 Zadanie 1 🛠🔥

Rozwiąż cztery pierwsze zadania z działu Główne: Wprowadzenie na stronie learngitbranching:

  1. Wprowadzenie do commitów Gita
  2. Rozgałęzienia w Gicie
  3. Merge w Gicie
  4. Wprowadzenie do Rebase

oraz kolejne siedem z działu Push & Pull – Zdalne repozytoria:

  1. Wstęp do klonowania (clone)
  2. Zdalne gałęzie
  3. Git fetch
  4. Git pull
  5. Symulacja pracy zespołowej
  6. Git push
  7. Rozbieżna historia

Ćwiczenia hands-on Git

🛠🔥 Zadanie 2 🛠🔥

Utwórz konto na GitHub (jeżeli posiadasz już konto, to nie musisz tworzyć kolejnego). Postaraj się użyć rozsądnej nazwy użytkownika, gdyż często repozytoria stanowią swojego rodzaju portfolia dla przyszłych pracodawcow. Postanów umieszczać tworzony kod na repozytoria Gita już dziś - z czasem stosowanie kontroli wersji stanie się to dobrym nawykiem i będziesz już dysponował pewną historią “kodowania”.


🛠🔥 Zadanie 3 🛠🔥

Utwórz nowe repozytorium za pomocą strony GitHub o nazwie np. hello-git. Pozostaw widoczność publiczną (Public). Wypełnij pole opisu (np. Przykładowe repozytorium do nauki obsługi gita), zaznacz chęć utworzeniu pliku README i wybierz licencję dla swojego projektu (np. MIT).


🛠🔥 Zadanie 4 🛠🔥

Otwórz terminal poleceń i skonfiguruj ustawienia Gita dla swojego użytkownika:

git config --global user.name "Nazwa uzytkownika Gita"
git config --global user.email "Adres e-mail uzytkownika Gita"

Wyświetl zapisane ustawienia komendą:

git config -l

🛠🔥 Zadanie 5 🛠🔥

Sklonuj na swój komputer utworzone repozytorium z githuba komendą git clone adres_www, korzystając z adresu HTTPS (Code → HTTPS, np. https://github.com/uzytkownik/repozytorium.git). Pobieranie publicznego repozytorium nie wymaga logowania.


🛠🔥 Zadanie 6 🛠🔥

Utwórz dowolny plik tekstowy w sklonowanym repozytorium i dodaj go do historii repozytorium. Wykorzystaj następujące komendy w poniższej kolejności:

Polecenie Funkcja
git status (Opcjonalnie) Powoduje wyświetlenie aktualnego stanu repozytorium, które pobrano na komputer
git add -A Komenda git add pozwala na podzielenie dokonanych zmian na różne commity, natomiast argument -A powoduje uwzględnienie wszystkich zmian jednocześnie. Zwróć uwagę, że interaktywne wprowadzenie, które rozwiązałeś pomijało tę komendę (zakładano commitowanie wszystkich zmian na raz).
git commit -m "Krotki opis wprowadzonych zmian" Dodaje do historii repozytorium wprowadzone zmiany

Commit zapisuje zmiany tylko w lokalnym repozytorium. Aby wysłać je na GitHub, trzeba użyć polecenia git push. Od 2021 roku GitHub nie pozwala na wysyłanie zmian przy użyciu hasła do konta. Zamiast tego trzeba się uwierzytelnić tokenem dostępu (przez HTTPS) lub kluczem SSH. Przed wykonaniem git push skonfiguruj dostęp w sposób odpowiedni dla komputera, na którym pracujesz:

Uwaga! Nigdy nie zapisuj tokenów ani kluczy prywatnych w plikach repozytorium, w adresie zdalnego repozytorium (np. https://TOKEN@github.com/...) ani na dysku współdzielonego komputera. Każdy, kto przejmie token lub klucz, może wysyłać zmiany w Twoim imieniu.

a) Komputer w laboratorium - fine-grained token

Fine-grained token pozwala ograniczyć uprawnienia do minimum: tylko do wybranych repozytoriów, tylko do wybranych operacji i tylko na określony czas.

  1. Na stronie GitHub przejdź do: Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token.
  2. Uzupełnij formularz:
    • Token name - np. lab-niodsr,
    • Expiration - jak najkrótszy okres (np. 1 dzień lub 7 dni),
    • Repository access - Only select repositories i wybierz repozytorium utworzone w Zadaniu 3 (fork z Zadania 9 dodasz po jego utworzeniu, edytując token),
    • Permissions → Repository permissions → Contents - ustaw Read and write (uprawnienie Metadata: Read-only zostanie dodane automatycznie).
  3. Kliknij Generate token i skopiuj token - zostanie wyświetlony tylko raz.
  4. Sprawdź, czy na komputerze nie jest skonfigurowane trwałe zapisywanie haseł:
git config --show-origin --get-all credential.helper

Jeśli widzisz store, nie korzystaj z niego - zapisuje on dane logowania jawnym tekstem w pliku ~/.git-credentials.

  1. Ustaw przechowywanie danych logowania tylko w pamięci i tylko na czas zajęć (tu: 2 godziny):
git config --global credential.helper 'cache --timeout=7200'
  1. Przy pierwszym git push (przez adres HTTPS, np. https://github.com/uzytkownik/repozytorium.git) jako Username podaj nazwę użytkownika GitHub, a jako Password wklej wygenerowany token.
  2. Po zakończeniu zajęć posprzątaj po sobie:
git credential-cache exit                # usuwa dane logowania z pamięci
ls ~/.git-credentials                    # plik NIE powinien istnieć
git config --global --unset credential.helper

Następnie usuń token na stronie GitHub (Fine-grained tokens → Delete), jeśli nie będzie Ci już potrzebny.

b) Własny laptop - klucz SSH

Na własnym komputerze z systemem Linux wygodniej jest skonfigurować jednorazowo klucz SSH. Klucz prywatny nie opuszcza Twojego komputera, a na GitHub trafia jedynie klucz publiczny.

Poniższe kroki są skróconą wersją oficjalnej instrukcji: Generating a new SSH key and adding it to the ssh-agent. W razie problemów skorzystaj z niej bezpośrednio.

  1. Wygeneruj parę kluczy, podając adres e-mail przypisany do konta GitHub. Lokalizację pliku zatwierdź klawiszem Enter (domyślnie ~/.ssh/id_ed25519). Gdy program zapyta o hasło (passphrase), ustaw je - zabezpieczy to klucz w razie kradzieży laptopa:
ssh-keygen -t ed25519 -C "adres_email@example.com"
  1. Dodaj klucz do agenta SSH, aby nie wpisywać hasła przy każdej operacji:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
  1. Wyświetl i skopiuj klucz publiczny (plik z rozszerzeniem .pub). Pliku id_ed25519 (bez rozszerzenia) nigdy nikomu nie udostępniaj.
cat ~/.ssh/id_ed25519.pub
  1. Na stronie GitHub kliknij swoje zdjęcie profilowe i przejdź do: Settings → SSH and GPG keys (sekcja Access) → New SSH key. W polu Title wpisz nazwę (np. laptop), jako Key type wybierz Authentication Key, w polu Key wklej skopiowany klucz publiczny i kliknij Add SSH key.
  2. Sprawdź połączenie:
ssh -T git@github.com

Przy pierwszym połączeniu zostanie wyświetlony odcisk (fingerprint) klucza serwera - porównaj go z odciskami opublikowanymi przez GitHub i dopiero wtedy wpisz yes. Poprawna konfiguracja kończy się komunikatem Hi NazwaUzytkownika! You've successfully authenticated, but GitHub does not provide shell access.

  1. Zmień adres zdalny repozytorium sklonowanego w Zadaniu 5 z HTTPS na SSH (adres SSH znajdziesz na stronie repozytorium: Code → SSH):
git remote set-url origin git@github.com:uzytkownik/repozytorium.git

Kolejne repozytoria możesz od razu klonować przez adres SSH, np.:

git clone git@github.com:uzytkownik/repozytorium.git

Po skonfigurowaniu dostępu wyślij zmiany na serwer:

git push

Polecenie git push powoduje zaktualizowanie repozytorium zdalnego. Zaobserwuj efekt na Githubie, zapoznaj się z interfejsem użytkownika repozytorium.


🛠🔥 Zadanie 7 🛠🔥

Kod zawierający informacje o autorze, zależnościach w projekcie, sposobie instalacji i uruchamiania jest prościej wykorzystać. Takie informacje standardowo umieszcza się w pliku README.md. Język jakim posługujemy się do tworzenia takich plików jest Markdown. Korzystając z informacji o składni postaraj się wyedytować plik README.md uzyskując poniższy efekt. Wykorzystaj do tego edytor w przeglądarce na stronie Github.


🛠🔥 Zadanie 8 🛠🔥

Wywołaj komendę cat na lokalnym pliku README.md, aby wyświetlić jego zawartość. Dlaczego plik nie zawiera wprowadzonych zmian? Zaktualizuj lokalną wersję repozytorium korzystając z komendy git pull.


🛠🔥 Zadanie 9 🛠🔥

Projekty, w których będziesz brał udział w przyszłości najczęściej będą tworzone zespołowo. Wiele repozytoriów jest również open-source, czyli może mieć wpływ na znajdujący się w nich kod. W tym zadaniu zaproponujemy zmianę w repozytorium prowadzącego. Nie masz uprawnień do zapisu w tym repozytorium, dlatego utworzysz jego kopię na swoim koncie (fork), wgrasz do niej swoje zmiany, a następnie poprosisz prowadzącego o ich dołączenie (pull request): 1. Otwórz wskazane repozytorium w przeglądarce i kliknij Fork → Create fork. Na Twoim koncie zostanie utworzona kopia repozytorium prowadzącego. 2. Jeśli korzystasz z tokena (Zadanie 6, wariant a), dodaj utworzony fork do repozytoriów, do których token ma dostęp (Fine-grained tokens → wybierz token → Edit → Repository access). Jeśli korzystasz z klucza SSH (Zadanie 6, wariant b), nie musisz nic konfigurować - klucz daje dostęp do wszystkich Twoich repozytoriów. 3. Sklonuj swój fork (git clone adres_forka) i przejdź do katalogu z repozytorium (cd NazwaRepozytorium). Na komputerze w laboratorium użyj adresu HTTPS (Code → HTTPS), a na własnym laptopie adresu SSH (Code → SSH). Adres forka zostanie zapisany jako zdalne repozytorium o nazwie origin. 4. Dodaj repozytorium prowadzącego jako drugie zdalne repozytorium o nazwie upstream (git remote add upstream adres_https_repozytorium_prowadzacego). Z tego repozytorium będziesz tylko pobierać zmiany, więc wystarczy adres HTTPS - również przy korzystaniu z SSH. Wyświetl listę zdalnych repozytoriów komendą git remote -v. 5. Stwórz własną gałąź w repozytorium nazywając ją swoją nazwą użytkownika. (git branch NazwaGalezi). Uwaga! Możesz wykonać polecenie 5 i 6 jedną komendą dodając argument (git checkout -b NazwaGalezi). 6. Zmień aktualną gałąź na nowo-utworzoną (git checkout NazwaGalezi). 7. Stwórz nowy katalog (nazwij go swoją nazwą użytkownika), a w tym katalogu plik tekstowy (nazwij go swoimi inicjałami .txt) i wklej do niego przykładowy tekst (United we stand, divided we fall!). 8. Dodaj nowe pliki do śledzenia i dodaj je do historii repozytorium (git add -A i git commit -m "NazwaCommita"). 9. Wgraj gałąź do swojego forka (git push -u origin NazwaGalezi). Argument -u powoduje, że zmiany w nowo-utworzonej lokalnie gałęzi będą śledzone w stosunku do zmian w repozytorium zdalnym. 10. Korzystając z interfejsu użytkownika Githuba utwórz pull request utworzonej gałęzi do gałęzi głównej repozytorium prowadzącego (Compare & pull request - jako base repository powinno być wybrane repozytorium prowadzącego). 11. Fork nie aktualizuje się automatycznie. Gdy prowadzący dołączy (merge) pull requesty, przełącz się na gałąź główną (git checkout main) i pobierz z repozytorium prowadzącego aktualną wersję (git pull upstream main). Sprawdź, czy w repozytorium pojawiły się katalogi innych osób. Na koniec wyślij zaktualizowaną gałąź główną do swojego forka (git push origin main).


🛠🔥 Zadanie domowe 🛠🔥

Znajdź odpowiedź na pytanie - jaki jest cel pliku .gitignore?

Źródła i dodatkowe materiały: